import { CloneObject, UrlParam } from "../tools/common"
import $ = require("jquery");

/** 访问类型方法 */
export type ApiItemMethod =
    "POST" | "post" |
    "GET" | "get";

/** API配置项设置 */
export class Api {
    /** 访问URL地址 */
    public Url: string;
    /** 访问方式 */
    public Method: ApiItemMethod;

    /**
     * 初始化参数
     * @param url 访问URL地址
     * @param method 访问方式
     */
    constructor(url: string, method: ApiItemMethod) {
        this.Url = url;
        this.Method = method;
    }

    /**
     * 赋值到URL路径地址
     * @param urldata 赋值参数
     * @returns 结果克隆对象
     */
    public UrlData(urldata: object): Api {
        var api = CloneObject(this);
        var url = api.Url;
        if (urldata) {
            for (var i in urldata) {
                url = UrlParam(url, i, urldata[i]);
            }
        }
        api.Url = url;
        return api;
    }
}

/** 请求响应结果 */
export interface Response
{
    /** 是否发生错误 */
    IsError: boolean;
    /** 错误消息 */
    ErrorMessage?: string;
    /** 发生异常 */
    Excption?: Error;
    /** 返回数据 */
    Data: any;
}

/**
 * 访问API内容 (异步方法)
 * @param api API配置
 * @param data 传参数据
 * @returns 响应结果
 */
export default function Call(api: Api, data?: object): Promise<Response> {
    var method = api.Method.toLowerCase();
    var body: any = data;
    if (method === 'post') {
        body = data ? JSON.stringify(data) : null;
    }
    return new Promise(function (resolve: (value: Response) => void, reject: (reason?: any) => void) {
        var rdata = {} as Response;
        try {
            $.ajax({
                type: method,
                url: api.Url,
                data: body,
                contentType: 'application/json',
                success: function (result) {
                    rdata.IsError = false;
                    rdata.Data = result;
                    resolve(rdata);
                },
                error: function (result: JQueryXHR) {
                    console.error("服务器错误内容:", result);
                    console.error("Call.api:", api);
                    console.error("Call.data:", data);
                    rdata.IsError = true;
                    rdata.ErrorMessage = "执行 $.ajax 成功, 但服务器出错!!!";
                    rdata.Data = null;
                    resolve(rdata);
                }
            });
        } catch (error) {
            console.error("$.ajax 异常内容:", error);
            console.error("Call.api:", api);
            console.error("Call.data:", data);
            rdata.IsError = true;
            rdata.ErrorMessage = "执行 $.ajax 出错!!!";
            rdata.Excption = error;
            rdata.Data = null;
            resolve(rdata);
        }
    });
}
